
// import uvm_pkg::*;

// `include "uvm_macros.svh"




// class arbiter2to1_driver extends uvm_driver;

//     `uvm_component_utils(arbiter2to1_driver)

//     virtual axis_master_if vif1;
//     virtual axis_master_if vif2;

//     function new(string name = "arbiter2to1_driver", uvm_component parent = null);
//         super.new(name, parent);
//         `uvm_info("arbiter2to1_driver","new is called",UVM_LOW)
//     endfunction

//     function void build_phase(uvm_phase phase);
//         super.build_phase(phase);
//         `uvm_info("arbiter2to1_driver","build_phase is called",UVM_LOW)
//         if(!uvm_config_db# (virtual axis_master_if )::get(this, "", "vif1",vif1))
//             `uvm_fatal("arbiter2to1_driver", "virtual axis_master_if must be set for vif1!!!")
//         if(!uvm_config_db# (virtual axis_master_if )::get(this, "", "vif2",vif2))
//             `uvm_fatal("arbiter2to1_driver", "virtual axis_master_if must be set for vif2!!!")
        
//     endfunction


//     task main_phase(uvm_phase phase);
//         //object maismch,if there is not raise,the task finish immdately
//         phase.raise_objection(this);
//         `uvm_info("arbiter2to1_driver","main_phase is called",UVM_LOW)
//         while(vif1.rst)
//         fork
//             channel1_tx_pakage();
//             channel2_tx_pakage();
//         join
//         //when there is raise ,the simlation finshed when drop
//         phase.drop_objection(this);
//     endtask

//     task channel1_tx_pakage();
//         tx_pakage(46, vif1);
//         #1us;
//         tx_pakage(46, vif1);
//         #1us;
//         tx_pakage(46, vif1);
//         #1us;
    
//     endtask

//     task channel2_tx_pakage();
//         tx_pakage(46, vif2);
//         tx_pakage(1500, vif2);
//         tx_pakage(46, vif2);
//         tx_pakage(46, vif2);
    
//     endtask

//     task tx_pakage(logic [15:0] len, virtual axis_master_if vif);
//         logic [15:0] i = 0;
//         vif.axis_tx_data <= 0;
//         vif.axis_tx_valid <= 0;
//         vif.axis_tx_last <= 0;
//         vif.axis_tx_user <= 0;
//         @(posedge vif.clk);
//         vif.axis_tx_user <= {16'h0806,len};
//         vif.axis_tx_valid <= 1;
//         vif.axis_tx_data <= i[7:0];
//         repeat(len) begin
//             @(negedge vif.clk);
//             wait(vif.axis_tx_ready==1)
//             i = i+1;
//             @(posedge vif.clk);
//             vif.axis_tx_data <= i[7:0];   
//             if(i == len-1)
//             vif.axis_tx_last <= 1;        
//         end
//         vif.axis_tx_valid <= 0;
//         vif.axis_tx_data <= 0;
//         vif.axis_tx_last <= 0;
    
//     endtask

    

// endclass




// module tb_arbiter2to1;

//     logic   clk             ;
//     logic   rst             ;

//     logic                mac_tx_is_broadcast     ;
//     logic   [7 :0]       mac_axis_tx_data        ;
//     logic   [31:0]       mac_axis_tx_user        ;
//     logic                mac_axis_tx_last        ;
//     logic                mac_axis_tx_valid       ;
//     logic                mac_axis_tx_ready       ;


//     axis_master_if axis_tx1_if(clk,rst);
//     axis_master_if axis_tx2_if(clk,rst);

//     assign mac_axis_tx_ready = 1;


//     arbiter2to1 dut(
//       .i_clk                     ( clk),
//       .i_rst                     ( rst),
//       .i_tx1_is_broadcast        ( 0),
//       .i_axis_tx1_user           ( axis_tx1_if.axis_tx_user   ),
//       .i_axis_tx1_data           ( axis_tx1_if.axis_tx_data   ),
//       .i_axis_tx1_last           ( axis_tx1_if.axis_tx_last   ),
//       .i_axis_tx1_valid          ( axis_tx1_if.axis_tx_valid  ),
//       .o_axis_tx1_ready          ( axis_tx1_if.axis_tx_ready  ),
      

//       .i_tx2_is_broadcast        ( 0),
//       .i_axis_tx2_user           ( axis_tx2_if.axis_tx_user     ),
//       .i_axis_tx2_data           ( axis_tx2_if.axis_tx_data     ),
//       .i_axis_tx2_last           ( axis_tx2_if.axis_tx_last     ),
//       .i_axis_tx2_valid          ( axis_tx2_if.axis_tx_valid    ),
//       .o_axis_tx2_ready          ( axis_tx2_if.axis_tx_ready    ),
      
//       .o_tx_is_broadcast         ( mac_tx_is_broadcast          ),
//       .o_axis_tx_user            ( mac_axis_tx_user             ),
//       .o_axis_tx_data            ( mac_axis_tx_data             ),
//       .o_axis_tx_last            ( mac_axis_tx_last             ),
//       .o_axis_tx_valid           ( mac_axis_tx_valid            ),
//       .i_axis_tx_ready           ( mac_axis_tx_ready            )
//    );

  
//     initial begin
//         clk <= 0;
//         forever begin
//             #4ns;
//             clk <= ~clk;
//         end
//     end

//     initial begin
//         rst <= 1;
//         #100ns;
//         @(posedge clk)
//         #1ns;
//         rst <= 0;
//     end


//     initial begin
//         uvm_config_db# (virtual axis_master_if )::set(null, "uvm_test_top","vif1",axis_tx1_if);
//         uvm_config_db# (virtual axis_master_if )::set(null, "uvm_test_top","vif2",axis_tx2_if);
//         run_test("arbiter2to1_driver");
//     end

// endmodule